home *** CD-ROM | disk | FTP | other *** search
/ Java Primer Plus / Java Primer Plus (Waite Group Proess)(1996).iso / java_Win / demo / BouncingHeads / BounceItem.java < prev    next >
Text File  |  1995-10-13  |  7KB  |  259 lines

  1. /*
  2.  * %W% %E%
  3.  *
  4.  * Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
  8.  * without fee is hereby granted. 
  9.  * Please refer to the file http://java.sun.com/copy_trademarks.html
  10.  * for further important copyright and trademark information and to
  11.  * http://java.sun.com/licensing.html for further important licensing
  12.  * information for the Java (tm) Technology.
  13.  * 
  14.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  15.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  16.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  17.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  18.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  19.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  20.  * 
  21.  * THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
  22.  * CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
  23.  * PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
  24.  * NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
  25.  * SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
  26.  * SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
  27.  * PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES").  SUN
  28.  * SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
  29.  * HIGH RISK ACTIVITIES.
  30.  */
  31.  
  32. import java.util.Hashtable;
  33. import java.applet.*;
  34. import java.io.*;
  35. import java.awt.*;
  36. import java.net.*;
  37.  
  38. /**
  39.  * @author    Jonathan Payne
  40.  * @version     %I%, %G%
  41.  */
  42.  
  43. class BounceImage {
  44.     static float inelasticity = .96f;
  45.     static float Ax = 0.0f;
  46.     static float Ay = 0.0002f;
  47.     static float Ar = 0.9f;
  48.  
  49.     public float x = 0;
  50.     public float y = 0;
  51.     public int width;
  52.     public int height;
  53.     public float Vx = 0.1f;
  54.     public float Vy = 0.05f;
  55.     public int index;
  56.     public float Vr = 0.005f + (float)Math.random() * 0.001f;
  57.     public float findex = 0f;
  58.  
  59.     BounceItem    parent;
  60.     static boolean  imagesReadIn = false;
  61.  
  62.     public void play(int n) {
  63.     if (parent.sounds[n] != null) {
  64.         parent.sounds[n].play();
  65.     }
  66.     }
  67.  
  68.     public BounceImage(BounceItem parent) {
  69.     this.parent = parent;
  70.     width = 65;
  71.     height = 72;
  72.     }
  73.  
  74.     public void move(float x1, float y1) {
  75.     x = x1;
  76.     y = y1;
  77.     }
  78.  
  79.     public void paint(Graphics g) {
  80.     int i = index;
  81.  
  82.     if (parent.bounceimages[i] == null) {
  83.         i = 0;
  84.     }
  85.     g.drawImage(parent.bounceimages[i], (int)x, (int)y, null);
  86.     }
  87.  
  88.     public void step(long deltaT) {
  89.     boolean    collision_x = false;
  90.     boolean    collision_y = false;
  91.  
  92.     float jitter = (float)Math.random() * .01f - .005f;
  93.  
  94.     x += Vx * deltaT + (Ax / 2.0) * deltaT * deltaT;
  95.     y += Vy * deltaT + (Ay / 2.0) * deltaT * deltaT;
  96.     if (x <= 0.0f) {
  97.         x = 0.0f;
  98.         Vx = -Vx * inelasticity + jitter;
  99.         collision_x = true;
  100.         play((int)(Math.random() * 3));
  101.     }
  102.     Dimension d = parent.size();
  103.     if (x + width >= d.width) {
  104.         x = d.width - width;
  105.         Vx = -Vx * inelasticity + jitter;
  106.         collision_x = true;
  107.         play((int)(Math.random() * 3));
  108.     }
  109.     if (y <= 0) {
  110.         y = 0;
  111.         Vy = -Vy * inelasticity + jitter;
  112.         collision_y = true;
  113.         play((int)(Math.random() * 3));
  114.     }
  115.     if (y + height >= d.height) {
  116.         y = d.height - height;
  117.         Vx *= inelasticity;
  118.         Vy = -Vy * inelasticity + jitter;
  119.         collision_y = true;
  120.     }
  121.     move(x, y);
  122.     Vy = Vy + Ay * deltaT;
  123.     Vx = Vx + Ax * deltaT;
  124.  
  125.     findex += Vr * deltaT;
  126.     if (collision_x || collision_y) {
  127.         Vr *= Ar;
  128.     }
  129.  
  130.     while (findex <= 0.0) {
  131.         findex += parent.bounceimages.length;
  132.     }
  133.     index = ((int) findex) % parent.bounceimages.length;
  134.  
  135.     }
  136. }
  137.  
  138. public class BounceItem extends Applet implements Runnable {
  139.     boolean images_initialized = false;
  140.     BounceImage images[];
  141.  
  142.     boolean time_to_die;
  143.     AudioClip music;
  144.     AudioClip sounds[];
  145.     Image bounceimages[];
  146.  
  147.     public BounceItem() {
  148.     }
  149.  
  150.     void makeImages(int nimages) {
  151.  
  152.     bounceimages = new Image[8];
  153.     for (int i = 1 ; i <= 8 ; i++) {
  154.         bounceimages[i-1] = getImage(getCodeBase(), "images/jon/T" + i + ".gif");
  155.         //System.out.println("d = " + bounceimages[i-1].getWidth() + "," + bounceimages[i-1].getHeight());
  156.     }
  157.  
  158.     images = new BounceImage[nimages];
  159.     for (int i = 0; i < nimages; i++) {
  160.         BounceImage    img = images[i] = new BounceImage(this);
  161.         img.move(1 + img.width * .8f * (i % 3) + i / 3 * .3f * img.width,
  162.              img.height * .3f + (i % 3) * .3f * img.height);
  163.     }
  164.  
  165.     sounds = new AudioClip[4];
  166.     sounds[0] = getAudioClip(getCodeBase(), "audio/ooh.au");
  167.     sounds[1] = getAudioClip(getCodeBase(), "audio/ah.au");
  168.     sounds[2] = getAudioClip(getCodeBase(), "audio/dah.au");
  169.     sounds[3] = getAudioClip(getCodeBase(), "audio/gong.au");
  170.     music = getAudioClip(getCodeBase(), "audio/spacemusic.au");
  171.     }
  172.  
  173.     public void run() {
  174.     long lasttime;
  175.  
  176.     try {
  177.         if (images == null) {
  178.         System.out.println("Making images ...");
  179.         makeImages(4);
  180.         }
  181.  
  182.         if (music != null) {
  183.         music.loop();
  184.         }
  185.         lasttime = System.currentTimeMillis();
  186.         while (!time_to_die) {
  187.         int i;
  188.         long now = System.currentTimeMillis();
  189.         long deltaT = now - lasttime;
  190.         boolean active = false;
  191.         Dimension d = size();
  192.  
  193.         for (i = 0; i < images.length; i++) {
  194.             BounceImage        img = images[i];
  195.  
  196.             img.step(deltaT);
  197.             if (img.Vy > .05 || -img.Vy > .05 || img.y + img.width < d.height - 10) {
  198.             active = true;
  199.             }
  200.         }
  201.         if (!active && images.length != 0) {
  202.             for (i = 0; i < images.length; i++) {
  203.             BounceImage img = images[i];
  204.  
  205.             img.Vx = (float)Math.random() / 4.0f - 0.125f;
  206.             img.Vy = -(float)Math.random() / 4.0f - 0.2f;
  207.             img.Vr = 0.05f - (float)Math.random() * 0.1f;
  208.             }
  209.             if (sounds[3] != null) {
  210.             sounds[3].play();
  211.             }
  212.         }
  213.         repaint();
  214.         lasttime = now;
  215.         try {
  216.             Thread.sleep(100);
  217.         } catch (InterruptedException e) {
  218.             return;
  219.         }
  220.         }
  221.     } finally {
  222.         if (music != null) {
  223.         music.stop();
  224.         }
  225.     }
  226.         
  227.     }
  228.  
  229.     public void init() {
  230.     Dimension d = size();
  231.     if ((d.width <= 100) || (d.height <= 100)) {
  232.         resize(500, 300);
  233.     }
  234.     }
  235.  
  236.     public void start() {
  237.     time_to_die = false;
  238.     (new Thread(this)).start();
  239.     }
  240.  
  241.     public void stop() {
  242.     time_to_die = true;
  243.     music.stop();
  244.     }
  245.  
  246.     public void paint(Graphics g) {
  247.     Dimension d = size();
  248.     g.setColor(Color.gray);
  249.     g.drawRect(0, 0, d.width - 1, d.height - 1);
  250.     if (images != null) {
  251.         for (int i = 0; i < images.length; i++) {
  252.         if (images[i] != null) {
  253.             images[i].paint(g);
  254.         }
  255.         }
  256.     }
  257.     }
  258. }
  259.